package jmovie;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Iterator;
import java.util.Map;

import javax.swing.JOptionPane;

import org.jdom.Document;
import org.jdom.Element;
import org.jdom.input.SAXBuilder;
import org.jdom.output.Format;
import org.jdom.output.XMLOutputter;

import com.healthmarketscience.jackcess.Database;
import com.healthmarketscience.jackcess.Table;

public class IO {
	
	private static String currentDBPath;

	public static ArrayList<Film> importFilmUpDB(File dbFile) {
		ArrayList<Film> listaFilm = new ArrayList<Film>();
		try {
			Table table;
			Database db = Database.open(dbFile);
			table = db.getTable("FILM");
			
			for(Map<String, Object> row : table) {
				Film film = new Film();
				
				// TODO migliorare...
				
				film.attributes.put(Film.TITOLO, (String) row.get("TITOLO_FILM"));
				film.attributes.put(Film.TITOLO_ORIGINALE, (String) row.get("TITOLO_ORIGINALE"));
				film.attributes.put(Film.ANNO, (String) row.get("ANNO_PUBBLICAZIONE"));
				film.attributes.put(Film.CAST, (String) row.get("CAST"));
//				film.attributes.put(Film.DISTRIBUZIONE, (String) row.get("DISTRUBUZIONE"));
				film.attributes.put(Film.DURATA, (String) row.get("DURATA"));
//				film.attributes.put(Film.PRODUZIONE, (String) row.get("PRODUZIONE"));
				film.attributes.put(Film.REGIA, (String) row.get("REGIA"));
				film.attributes.put(Film.HOMEPAGE, (String) row.get("HOMEPAGE"));
				film.attributes.put(Film.TRAMA, (String) row.get("TRAMA"));
				film.attributes.put(Film.GENERE, (String) row.get("GENERE"));
				film.attributes.put(Film.LINGUE, (String) row.get("ELENCO_LINGUE"));
				film.attributes.put(Film.LOCANDINA, (String) row.get("PATH_LOCANDINA"));
//				film.attributes.put(Film.NAZIONE, (String) row.get("NAZIONE"));
				
				listaFilm.add(film);
			}
			Collections.sort(listaFilm);
		} catch (IOException e) {
			JOptionPane.showMessageDialog(GuiManager.getFrame(), 
					"ERRORE: impossibile importare il file:\n\t'" + dbFile.getPath() + "'");
			e.printStackTrace();
		}
		return listaFilm;
	}
	
	public static ArrayList<Film> caricaDaFile(File dbFile) {
		ArrayList<Film> listaFilm = new ArrayList<Film>();
		try {
			SAXBuilder builder = new SAXBuilder();
			Document doc = builder.build(dbFile);
			Element root = doc.getRootElement();
			@SuppressWarnings("unchecked")
			Iterator<Element> it = root.getChildren().iterator();
			while (it.hasNext()) {
				Element el = it.next();
				Film film = new Film();
				
				film.attributes.put(Film.TITOLO, el.getChild("titolo").getText());
				film.attributes.put(Film.TITOLO_ORIGINALE, el.getChild("titoloOriginale").getText());
				film.attributes.put(Film.ANNO, el.getChild("anno").getText());
				film.attributes.put(Film.CAST, el.getChild("cast").getText());
				film.attributes.put(Film.DISTRIBUZIONE, el.getChild("distribuzione").getText());
				film.attributes.put(Film.DURATA, el.getChild("durata").getText());
				film.attributes.put(Film.PRODUZIONE, el.getChild("produzione").getText());
				film.attributes.put(Film.REGIA, el.getChild("regia").getText());
				film.attributes.put(Film.HOMEPAGE, el.getChild("homepage").getText());
				film.attributes.put(Film.TRAMA, el.getChild("trama").getText());
				film.attributes.put(Film.GENERE, el.getChild("genere").getText());
				film.attributes.put(Film.LINGUE, el.getChild("elencoLingue").getText());
				film.attributes.put(Film.LOCANDINA, el.getChild("pathLocandina").getText());
				film.attributes.put(Film.LOCANDINA_GRANDE, el.getChild("pathLocandinaGrande").getText());
				film.attributes.put(Film.COMMENTI, el.getChild("commenti").getText());
				film.attributes.put(Film.SUPPORTO, el.getChild("supporto").getText());
				film.attributes.put(Film.WISHLIST, el.getChild("wishlist").getText());
				film.attributes.put(Film.PRESTITO, el.getChild("prestito").getText());
				film.attributes.put(Film.NAZIONE, el.getChild("nazione").getText());
				
				listaFilm.add(film);
			}
			
		} catch (Exception e) {
			JOptionPane.showMessageDialog(GuiManager.getFrame(), 
					"ERRORE: impossibile leggere il file:\n\t'" + dbFile + "'");
			System.out.println(e.getStackTrace());
			writeCurrentDB("");
			currentDBPath = null;
		}
		return listaFilm;
	}
	
	public static void salvaSuFile(File file) {
		try {
			Element root = new Element("FilmDB");
			Document document = new Document(root);
			
			for (Film film : GuiManager.getFrame().getListaFilm()) {
				Element filmElement = new Element("film");
				root.addContent(filmElement);
				
				Element titolo = new Element("titolo");
				titolo.addContent(film.get(Film.TITOLO));
				filmElement.addContent(titolo);
				
				Element titoloOriginale = new Element("titoloOriginale");
				titoloOriginale.addContent(film.get(Film.TITOLO_ORIGINALE));
				filmElement.addContent(titoloOriginale);
				
				Element regia = new Element("regia");
				regia.addContent(film.get(Film.REGIA));
				filmElement.addContent(regia);
				
				Element anno = new Element("anno");
				anno.addContent(film.get(Film.ANNO));
				filmElement.addContent(anno);
				
				Element trama = new Element("trama");
				trama.addContent(film.get(Film.TRAMA));
				filmElement.addContent(trama);
				
				Element genere = new Element("genere");
				genere.addContent(film.get(Film.GENERE));
				filmElement.addContent(genere);
				
				Element cast = new Element("cast");
				cast.addContent(film.get(Film.CAST));
				filmElement.addContent(cast);
				
				Element durata = new Element("durata");
				durata.addContent(film.get(Film.DURATA));
				filmElement.addContent(durata);
				
				Element homepage = new Element("homepage");
				homepage.addContent(film.get(Film.HOMEPAGE));
				filmElement.addContent(homepage);
				
				Element elencoLingue = new Element("elencoLingue");
				elencoLingue.addContent(film.get(Film.LINGUE));
				filmElement.addContent(elencoLingue);
				
				Element pathLocandina = new Element("pathLocandina");
				pathLocandina.addContent(film.get(Film.LOCANDINA));
				filmElement.addContent(pathLocandina);
				
				Element pathLocandinaGrande = new Element("pathLocandinaGrande");
				pathLocandinaGrande.addContent(film.get(Film.LOCANDINA_GRANDE));
				filmElement.addContent(pathLocandinaGrande);
				
				Element produzione = new Element("produzione");
				produzione.addContent(film.get(Film.PRODUZIONE));
				filmElement.addContent(produzione);
				
				Element distribuzione = new Element("distribuzione");
				distribuzione.addContent(film.get(Film.DISTRIBUZIONE));
				filmElement.addContent(distribuzione);
		
				Element commenti = new Element("commenti");
				commenti.addContent(film.get(Film.COMMENTI));
				filmElement.addContent(commenti);
				
				Element supporto = new Element("supporto");
				supporto.addContent(film.get(Film.SUPPORTO));
				filmElement.addContent(supporto);
				
				Element wishlist = new Element("wishlist");
				wishlist.addContent(film.get(Film.WISHLIST));
				filmElement.addContent(wishlist);
				
				Element prestito = new Element("prestito");
				prestito.addContent(film.get(Film.PRESTITO));
				filmElement.addContent(prestito);
				
				Element nazione = new Element("nazione");
				nazione.addContent(film.get(Film.NAZIONE));
				filmElement.addContent(nazione);
			}
			
			XMLOutputter outputter = new XMLOutputter();
			outputter.setFormat( Format.getPrettyFormat() );
			outputter.output( document, new FileOutputStream(file) );
			
			JOptionPane.showMessageDialog(GuiManager.getFrame(), "Tutte le modifiche sono state salvate");
			
			GuiManager.getFrame().setModificato(false);
			
		} catch (Exception e1) {
			JOptionPane.showMessageDialog(GuiManager.getFrame(), "ERRORE: impossibile salvare");
			e1.printStackTrace();
		}
	}
	
	public static String getCurrentDB() {
		if (currentDBPath == null) {
			try {
				File f = new File("currentDB");
				if (f.canWrite() == false || f.canRead() == false) {
					f.setWritable(true);
					f.setReadable(true);
				}
				BufferedReader in = new BufferedReader(new FileReader(f));
				currentDBPath = in.readLine();
				if (currentDBPath == null || currentDBPath.isEmpty()) 
					currentDBPath = null;
				in.close();
			} catch (FileNotFoundException e1) {
				File f = new File("currentDB");
				try {
					f.createNewFile();
					f.setReadable(true);
					f.setWritable(true);
					currentDBPath = null;
				} catch (IOException e) {
					e.printStackTrace();
				}
			} catch (IOException e2) {
				e2.printStackTrace();
			}
		}
		return currentDBPath;
	}
	
	public static void writeCurrentDB(String filePath) {
		try {
			PrintWriter out = new PrintWriter(new File("currentDB"));
			out.println(filePath);
			out.close();
			currentDBPath = filePath;
		} catch (Exception e) {
			e.printStackTrace();
		}
	}
}
